import { KnowledgeRepository } from '../repositories/KnowledgeRepository';
import { KnowledgeInsert } from '../schemas/knowledge';

export class KnowledgeService {
  private knowledgeRepository: KnowledgeRepository;

  constructor() {
    this.knowledgeRepository = new KnowledgeRepository();
  }

  /**
   * 创建知识条目并生成向量嵌入
   * @param data - 知识数据
   * @param generateEmbedding - 生成向量嵌入的函数 (例如调用 OpenAI API)
   */
  async createKnowledge(
    data: Omit<KnowledgeInsert, 'embedding'>, 
    generateEmbedding: (content: string) => Promise<number[]>
  ) {
    // 1. 生成向量嵌入
    const embedding = await generateEmbedding(data.content);
    
    // 2. 保存到数据库
    return await this.knowledgeRepository.create(data, embedding);
  }

  /**
   * 基于内容相似度搜索知识
   * @param query - 查询内容
   * @param generateEmbedding - 生成向量嵌入的函数
   * @param limit - 返回结果数量
   */
  async searchSimilar(
    query: string,
    generateEmbedding: (content: string) => Promise<number[]>,
    limit: number = 10
  ) {
    // 1. 为查询生成向量嵌入
    const queryEmbedding = await generateEmbedding(query);
    
    // 2. 执行相似度搜索
    return await this.knowledgeRepository.findSimilar(queryEmbedding, limit);
  }

  /**
   * 在特定类型的知识中搜索
   * @param query - 查询内容
   * @param type - 知识类型
   * @param generateEmbedding - 生成向量嵌入的函数
   * @param limit - 返回结果数量
   */
  async searchSimilarByType(
    query: string,
    type: 'task' | 'document' | 'conversation',
    generateEmbedding: (content: string) => Promise<number[]>,
    limit: number = 5
  ) {
    // 1. 为查询生成向量嵌入
    const queryEmbedding = await generateEmbedding(query);
    
    // 2. 执行类型过滤的相似度搜索
    return await this.knowledgeRepository.findSimilarWithType(queryEmbedding, type, limit);
  }
}
